home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP20 / IMALLOC.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  3.6 KB  |  145 lines

  1. /*--------------------------------------------
  2.    IMALLOC.CPP -- Define an imalloc interface
  3.                   (c) Paul Yao, 1996
  4.   --------------------------------------------*/
  5. #include <windows.h>
  6. #include "imalloc.h"
  7.  
  8. //----------------------------------------------------------
  9. // CreateAllocator -- Exported function to create allocator
  10. //----------------------------------------------------------
  11. EXPORT LPMALLOC CreateAllocator ()
  12.      {
  13.      DAlloc *pAllocator = new DAlloc () ;
  14.      if (pAllocator != NULL && pAllocator->Initialize ())
  15.           {
  16.           pAllocator->AddRef () ;
  17.           }
  18.      else
  19.           {
  20.           delete pAllocator ;
  21.           }
  22.  
  23.      return (LPMALLOC) pAllocator ;
  24.      }
  25.  
  26. //-------------------------------------------------------------------
  27. DAlloc::DAlloc ()
  28.      {
  29.      RefCount = 0 ;
  30.      hHeap = NULL ;
  31.      }
  32.  
  33. //-------------------------------------------------------------------
  34. DAlloc::~DAlloc ()
  35.      {
  36.      if (hHeap)
  37.           HeapDestroy (hHeap) ;
  38.      }
  39.  
  40. //-------------------------------------------------------------------
  41. BOOL DAlloc::Initialize ()
  42.      {
  43.      hHeap = HeapCreate (0, 4096, 65535) ;
  44.  
  45.      return (BOOL)hHeap ;
  46.      }
  47.  
  48. //-------------------------------------------------------------------
  49. STDMETHODIMP
  50. DAlloc::QueryInterface (REFIID riid, LPVOID FAR *ppvObject)
  51.      {
  52.      // Always initialize "out" parameters to NULL
  53.      *ppvObject = NULL ;
  54.  
  55.      // Everyone supports IUnknown
  56.      if (riid == IID_IUnknown)
  57.           *ppvObject = (LPUNKNOWN) this ;
  58.  
  59.      // We support IMalloc
  60.      if (riid == IID_IMalloc)
  61.           *ppvObject = (LPMALLOC) this ;
  62.  
  63.      if (*ppvObject == NULL)
  64.           {
  65.           // Interface not supported
  66.           return E_NOINTERFACE ;
  67.           }
  68.      else
  69.           {
  70.           // Interface supported, so increment reference count
  71.           ((LPUNKNOWN) *ppvObject)->AddRef () ;
  72.           return S_OK ;
  73.           }
  74.      }
  75.  
  76. //-------------------------------------------------------------------
  77. STDMETHODIMP_ (ULONG)
  78. DAlloc::AddRef (void)
  79.      {
  80.      return ++RefCount ;
  81.      }
  82.  
  83. //-------------------------------------------------------------------
  84. STDMETHODIMP_ (ULONG)
  85. DAlloc::Release (void)
  86.      {
  87.      if (0L != --RefCount)
  88.           return RefCount ;
  89.  
  90.      delete this ;
  91.      return 0L ;
  92.      }
  93.  
  94. //-------------------------------------------------------------------
  95. STDMETHODIMP_ (void *)
  96. DAlloc::Alloc (ULONG cb)
  97.      {
  98.      return HeapAlloc (hHeap, HEAP_ZERO_MEMORY, cb) ;
  99.      }
  100.  
  101. //-------------------------------------------------------------------
  102. STDMETHODIMP_ (void *)
  103. DAlloc::Realloc (void *pv, ULONG cb)
  104.      {
  105.      return HeapReAlloc (hHeap, HEAP_ZERO_MEMORY, pv, cb) ;
  106.      }
  107.  
  108. //-------------------------------------------------------------------
  109. STDMETHODIMP_ (void)
  110. DAlloc::Free (void *pv)
  111.      {
  112.      HeapFree (hHeap, 0, pv) ;
  113.      }
  114.  
  115. //-------------------------------------------------------------------
  116. STDMETHODIMP_ (ULONG)
  117. DAlloc::GetSize (void *pv)
  118.      {
  119.      return HeapSize (hHeap, 0, pv) ;
  120.      }
  121.  
  122. //-------------------------------------------------------------------
  123. STDMETHODIMP_ (int)
  124. DAlloc::DidAlloc (void *pv)
  125.      {
  126.      PROCESS_HEAP_ENTRY phe ;
  127.  
  128.      ZeroMemory (&phe, sizeof (PROCESS_HEAP_ENTRY)) ;
  129.  
  130.      while (HeapWalk (hHeap, &phe))
  131.           {
  132.           if (phe.lpData == pv)
  133.                return 1 ;
  134.           }
  135.  
  136.      return 0 ;
  137.      }
  138.  
  139. //-------------------------------------------------------------------
  140. STDMETHODIMP_ (void)
  141. DAlloc::HeapMinimize (void)
  142.      {
  143.      HeapCompact (hHeap, 0) ;
  144.      }
  145.